package com.sls.nzdapplication.util;

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.Network;
import android.net.NetworkCapabilities;
import android.net.NetworkInfo;
import android.net.wifi.WifiManager;
import android.os.Build;

import java.net.InetAddress;
import java.net.NetworkInterface;
import java.util.Enumeration;

public class IPAddressHelper {
    /**
     * 获取当前设备的IP地址。
     * 如果是Wi-Fi连接，则返回Wi-Fi的IP地址；
     * 如果是移动数据连接，则返回移动数据的IP地址。
     *
     * @param context 应用程序上下文
     * @return 当前连接类型的IP地址字符串，如果无法获取则返回空字符串。
     */
    public static String getIPAddress(Context context) {
        // 获取系统的连接管理器
        ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

        if (connectivityManager != null) {
            // 根据API级别选择不同的方法来获取活动网络信息
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                Network activeNetwork = connectivityManager.getActiveNetwork();
                if (activeNetwork != null) {
                    NetworkCapabilities capabilities = connectivityManager.getNetworkCapabilities(activeNetwork);
                    if (capabilities != null) {
                        // 检查是否为Wi-Fi连接
                        if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
                            return getWifiIPAddress(context);
                        }
                        // 检查是否为蜂窝数据连接
                        else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
                            return getCellularIPAddress();
                        }
                    }
                }
            } else {
                // 对于较低版本的Android系统，使用旧的方式获取网络信息
                NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
                if (activeNetworkInfo != null && activeNetworkInfo.isConnected()) {
                    if (activeNetworkInfo.getType() == ConnectivityManager.TYPE_WIFI) {
                        return getWifiIPAddress(context);
                    } else if (activeNetworkInfo.getType() == ConnectivityManager.TYPE_MOBILE) {
                        return getCellularIPAddress();
                    }
                }
            }
        }

        // 如果没有找到有效的网络连接或无法获取IP地址，则返回空字符串
        return "";
    }

    /**
     * 获取Wi-Fi连接的IP地址。
     *
     * @param context 应用程序上下文
     * @return Wi-Fi连接的IP地址字符串，如果无法获取则返回空字符串。
     */
    private static String getWifiIPAddress(Context context) {
        WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
        if (wifiManager != null) {
            int ipAddress = wifiManager.getConnectionInfo().getIpAddress();

            // 将整数形式的IP地址转换为点分十进制格式
            return String.format("%d.%d.%d.%d",
                    (ipAddress & 0xff),
                    (ipAddress >> 8 & 0xff),
                    (ipAddress >> 16 & 0xff),
                    (ipAddress >> 24 & 0xff));
        }

        return "";
    }

    /**
     * 获取蜂窝数据连接的IP地址。
     *
     * @return 蜂窝数据连接的IP地址字符串，如果无法获取则返回空字符串。
     */
    private static String getCellularIPAddress() {
        try {
            for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
                NetworkInterface intf = en.nextElement();
                for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
                    InetAddress inetAddress = enumIpAddr.nextElement();
                    if (!inetAddress.isLoopbackAddress() && !inetAddress.isLinkLocalAddress()) {
                        // 确保我们只获取IPv4地址（对于大多数情况）
                        if (inetAddress.getHostAddress().indexOf(':') < 0) {
                            return inetAddress.getHostAddress();
                        }
                    }
                }
            }
        } catch (Exception ex) {
            // 处理异常
        }
        return "";
    }
}
